package com.tdam2011.grupo04;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;

import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.ContactsContract.PhoneLookup;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.tdam2011.grupo04.entidades.Mensaje;

public class HistorialMensajes extends MasterListActivity implements OnItemClickListener{
	
	private ImageButton img_nuevo_sms;
	private TextView txt_nuevo_sms;

	private MensajeAgendaAdapter adapter;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
	        super.onCreate(savedInstanceState);
	        setContentView(R.layout.historiales);
	        
	        findViewById(R.id.lout_log).setVisibility(LinearLayout.GONE);
	        
	        img_nuevo_sms= (ImageButton)findViewById(R.id.img_nuevo_mensaje);
	        txt_nuevo_sms= (TextView)findViewById(R.id.txt_nuevo_mensaje);
		    
		    img_nuevo_sms.setBackgroundResource(R.drawable.nuevo_mensaje);
		    txt_nuevo_sms.setText("Nuevo Mensaje");
	        	        
	        this.getListView().setOnItemClickListener(this);
			
		
	        this.getListView().setTextFilterEnabled(true);
	}
	
	@Override
	public void onResume(){
		super.onResume();
		cargarHistorialMensajes();
	}
	
	public void cargarHistorialMensajes(){
        //Preparamos la lista de contactos
        this.adapter= new MensajeAgendaAdapter();
        this.setListAdapter(adapter);
        
        //Cargamos datos en la agenda de contactos
        cargarAgenda();
	}
	public void nuevoMensaje(View v){
		Intent smsIntent = new Intent(Intent.ACTION_VIEW);
		smsIntent.setType("vnd.android-dir/mms-sms");
		smsIntent.putExtra("address", "");
		smsIntent.putExtra("sms_body","");
		startActivity(smsIntent);
	}
	
	public boolean onOptionsItemSelected(MenuItem item){
		if(item.getTitle().equals("Nuevo Mensaje")){
			Intent intent= new Intent(this.getApplicationContext(), Mensaje.class);
			startActivityForResult(intent, 0);
		}
    	super.onOptionsItemSelected(item);
    	return false;
    }
	
	@Override
	protected void publishFilterApplied() {
		super.publishFilterApplied();
		this.cargarAgenda();
	}

	private void cargarAgenda(){
		adapter.clearList();
		 
		String urlConversacion = "content://mms-sms/conversations";
		Uri uriConversacion = Uri.parse(urlConversacion);
		Cursor cursorConversacion= getContentResolver().query(uriConversacion, new String[]{"*"}, null, null, null);
		
		while(cursorConversacion.moveToNext()){
			int idThread= cursorConversacion.getInt(cursorConversacion.getColumnIndex("thread_id"));
			int idMensaje= cursorConversacion.getInt(cursorConversacion.getColumnIndex("_id"));
			String cuerpoMensaje= cursorConversacion.getString(cursorConversacion.getColumnIndex("body"));
			long fechaEnvio= cursorConversacion.getLong(cursorConversacion.getColumnIndex("date"));
			String telefono= cursorConversacion.getString(cursorConversacion.getColumnIndex("address"));
			
			String nombreContacto=telefono;
            Uri uriContacto = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(telefono));  
            Cursor cursorContacto= getContentResolver().query(uriContacto, new String[]{ContactsContract.Contacts._ID, PhoneLookup.DISPLAY_NAME, ContactsContract.Contacts.PHOTO_ID},PhoneLookup.NUMBER+"='"+telefono+"'",null,null);

            int foto= 0;
            String idContacto= null;
            if(cursorContacto.getCount()>0){
            	cursorContacto.moveToFirst();
            	nombreContacto=cursorContacto.getString(cursorContacto.getColumnIndex(PhoneLookup.DISPLAY_NAME));
            	foto= cursorContacto.getInt(cursorContacto.getColumnIndex(ContactsContract.Contacts.PHOTO_ID));
            	idContacto = cursorContacto.getString(cursorContacto.getColumnIndex(ContactsContract.Contacts._ID));
            }
            
            Mensaje mensaje= new Mensaje();
            mensaje.setId(idMensaje);
            mensaje.setThreadId(idThread);
            mensaje.setCuerpoMensaje(cuerpoMensaje);
            mensaje.setFechaEnvio(fechaEnvio);
            mensaje.setTelefonoContacto(telefono);
            mensaje.setNombreContacto(nombreContacto);
            
            if(foto > 0){
            	mensaje.setTieneFoto(true);
            	mensaje.setFoto(idContacto);
			}
            
            if(mensaje.getNombreContacto() != null && (!contactFilterApplied || mensaje.getNombreContacto().toLowerCase().startsWith(contactFilter))){
            	adapter.addMensaje(mensaje);	
            }
            
            cursorContacto.close();
		}
		cursorConversacion.close();

		adapter.notifyDataSetChanged();
	}
		
	class MensajeAgendaAdapter extends BaseAdapter implements Filterable{
		private ArrayList<Mensaje> mensajes;
		private LayoutInflater inflater;
		private ContactFilter filter;

		public MensajeAgendaAdapter() {
			mensajes = new ArrayList<Mensaje>();
			inflater = LayoutInflater.from(HistorialMensajes.this);
		}

		public void addMensaje(Mensaje mensaje) {
			if (mensaje != null) 
				this.mensajes.add(mensaje);
		}
		
		public int getCount() {
			return mensajes.size();
		}
		
		public Object getItem(int position) {
			return mensajes.get(position);
		}

		public long getItemId(int position) {
			return position;
		}
		
		public void clearList(){
			mensajes.clear();
		}

		class Holder {
			private ImageView img_contacto;
			private TextView txt_nombreContacto;
			private TextView txt_fechaEnvio;
			private TextView txt_cuerpoMensaje;
		}

		public View getView(int position, View convertView, ViewGroup arg2){
			Holder holder;
			if (convertView == null) {
				convertView = inflater.inflate(R.layout.historiales_fila , null);
				holder = new Holder();
				holder.txt_nombreContacto = (TextView) convertView
						.findViewById(R.id.txt_nombreContacto);
				holder.txt_fechaEnvio = (TextView) convertView
						.findViewById(R.id.txt_fechaMensaje);
				holder.img_contacto = (ImageView) convertView
						.findViewById(R.id.img_contacto);
				holder.txt_cuerpoMensaje = (TextView) convertView
						.findViewById(R.id.txt_cuerpoMensaje);
				convertView.setTag(holder);
			} else {
				holder = (Holder) convertView.getTag();
			}

			Mensaje mensaje = (Mensaje) getItem(position);
			
			if (mensaje.getTieneFoto()) {
				try {
					java.io.InputStream input;
					input = getContentResolver().openInputStream(mensaje.getFoto());
					final Bitmap bm = BitmapFactory.decodeStream(input);
					input.close();
					
					holder.img_contacto.setImageBitmap(bm);
				} catch (Exception e) {
					holder.img_contacto.setImageDrawable(getResources().getDrawable(R.drawable.contacto));
				}
			} else {
				holder.img_contacto.setImageDrawable(getResources().getDrawable(R.drawable.contacto));
			}

			String fecha = millisToDate(mensaje.getFechaEnvio());

			holder.txt_nombreContacto.setText(String.valueOf(mensaje.getNombreContacto()));
			holder.txt_cuerpoMensaje.setText(mensaje.getCuerpoMensaje());
			holder.txt_fechaEnvio.setText(fecha);

			return convertView;
		}
		
		@Override
		public Filter getFilter() {
			if (filter == null) {
				filter = new ContactFilter();
			}
			return filter;
		}
	}

	@Override
	public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
		Mensaje mensaje= (Mensaje)adapter.getItem(position);
		
		Intent smsIntent = new Intent(Intent.ACTION_VIEW);
		smsIntent.setType("vnd.android-dir/mms-sms");
		smsIntent.putExtra("address", String.valueOf(mensaje.getTelefonoContacto()));
		startActivity(smsIntent);
	}
	
	public static String millisToDate(long currentTime) {
	    String finalDate;
	    Calendar calendar = Calendar.getInstance();
	    calendar.setTimeInMillis(currentTime);
	    Date date = calendar.getTime();
	    finalDate = date.toString();
	    return finalDate;
	}
	
	
}
